package com.itheima.demo3;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        // 目标：完成题目3
        // 1、找出从起始日子到目标月份的全部日子。（因为后面每年的每个月日子可能有28,29，30,31天，干脆拿到目前到目标月份的所有天数）
        // 拿到起始休息日
        LocalDate startDate = LocalDate.of(2022, 2, 3);

        // 2、拿到用户查询的年份和月份，再拿到这个月份最后一天日子。
        Scanner sc = new Scanner(System.in);
        System.out.println("请您输入要查询的年份和月份，以便为你展示该月休息日（注意：必须是2022-02月开始或之后：）");
        String currentDate = sc.next() + "-01";

 /*      这样会报错，还是无法接受输入的日期字符串，所以考虑给用户输入的字符串后面，人为的添加一个日，组成年月日，这样符合格式就能解析了
                并且用户并不知道，并且不会影响程序功能和运行
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM");
        LocalDate endMonthFistDate = LocalDate.parse(currentDate,dtf);
        */

        //在后面第五步用，额外拿一个变量出来记住用户输入年月份的第一天起始日(该变量不改变)，因为用户只输入年月，但是我们加了 sc.next() + "-01"
        //不额外拿一个变量出来， 用户输入月份的第一天起始日在后面这里就没了：endDate = endDate.plusMonths(1).minusDays(1);
        LocalDate endMonthFistDate = LocalDate.parse(currentDate);

        LocalDate endDate = endMonthFistDate;
        // 拿到这个月份的最后一天日子，作为截止日期，后面用来显示该月份的所有休息日
        //sc.next() + "-01";这里已经固定了输入的年月后面加一个01，就相当于该月的第一天，例如输入2025-02-01，
        // 加一个月03-01，然后再减一天，就是02-28，这样就得到02月的最后一天了
        endDate = endDate.plusMonths(1).minusDays(1);

        // 3、从起始日子一直拿到截止日子中的全部日子对象，方便后面进行信息查询。
        //此时才发现用一个对象来存储信息更简单，每一个日子都是一个对象，记录自己的日期和是否休息
        List<Day> days = new ArrayList<>();
        //其实这里while的判断改为：startDate.isBefore(endDate) 更合适。只要startDate还没到用户输入月份的最后一天，startDate就一直加
        //用before不能等于endDate，也就是说不能判断用户输入月份的最后一天，例如5月份只能判断到5.30,5.31无法判断。应该对after取反
        while (!startDate.isAfter(endDate)) {
            //建一个只用date的有参构造器，先不要确定每个day对象的flag，后面再遍历days的集合，把所有的day对象的flag确定
            Day day = new Day(startDate);
            days.add(day);
            // 把这个日子走向下一天
            startDate = startDate.plusDays(1);
        }
        System.out.println("从2022年2月3日开始到用户目前输入年月的全部日子：");
        System.out.println(days);

        // 4、从头开始遍历，标记是否休息。
        System.out.println("从2022-02月到目前输入年月的历史休息情况如下：");
        for (int i = 0; i < days.size(); i+= 3) {
            Day day = days.get(i);
            day.setFlag(true); // 你去休息吧
            day.printInfo();
        }
        System.out.println();

        // 5、展示出当月的休息日情况。days集合里面包含了2022-02月到用户输入月份的所有日子，但是我们只需要展示用户输入月份的休息日
        System.out.println(currentDate + "月开始的休息情况如下：");
        List<Day> currentDayRest = new ArrayList<>();   //当前输入年月的休息日集合
        for (int i = 0; i < days.size(); i++) {
            Day day = days.get(i);
            //如果是在用户输入月份的第一天就不展示休息日，例如输入5月，那5.1之前的休息日不展示
            if(day.getDate().isBefore(endMonthFistDate)){
                continue;
            }
            // 展示用户输入月份的休息日。
            currentDayRest.add(day);
            day.printInfo();
        }
        System.out.println();


        // 6、找出当月哪些休息日是周末
        System.out.println("用户当前输入年月： "+currentDate + "这个月的所有周末情况如下：");

        //不简化写法
      /*  currentDayRest.stream().filter(d -> {
            return (d.getDate().getDayOfWeek().getValue() == 6
                    || d.getDate().getDayOfWeek().getValue() == 7) && d.isFlag();
        }).forEach(d ->{
            System.out.println(d);
            if (d.getDate().getDayOfWeek().getValue()==6){
                System.out.println("周六");
            }else {
                System.out.println("周日");
            }
                }
        );*/

        //lambda表达式stream流也可以加判断，不加isFlag的判断，而死把只要是周六周日就打印，错误的。题目要求员工休息日是隔两天休息一天
        currentDayRest.stream().filter(d ->  (d.getDate().getDayOfWeek().getValue() == 6
                    || d.getDate().getDayOfWeek().getValue() == 7)
        ).forEach(d ->
                System.out.print(d + (d.getDate().getDayOfWeek().getValue() == 6 ? "周六 " : "周日 "))
        );

        System.out.println( );
        System.out.println("--------------加了isFlag判断，找出既是周末又是休息的日子：--------------------");

        //lambda表达式stream流也可以加判断，简化写法
        currentDayRest.stream().filter(d -> {
            return (d.getDate().getDayOfWeek().getValue() == 6
                    || d.getDate().getDayOfWeek().getValue() == 7) && d.isFlag();       //还需要额外要求日期的flag是true
        }).forEach(d ->
                    System.out.print(d + (d.getDate().getDayOfWeek().getValue() == 6 ? "周六 " : "周日 "))
        );


    }
}
